package com.gosophia.commons.ws;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import com.gosophia.commons.Page;

/**
 * 
 * 配置一个适配器，将查询map类型的page数据转进行转换
 *
 * 如果需要从WebService中向客户端返回一个Page<Map>类型的数据，那么需要在自己的工程中定义一个类继承于此类，并将
 * 所定义的类标注在sei所返回Page<Map>类型的方法上。
 * 
 * @author zhao_yanfang
 *  
 */
public class MapPageAdapter<K, V> extends
		XmlAdapter<MapPair<K, V>, Page<Map<K, V>>> {
	/***
	 * 将Page<Map>类型转换为一个MapPair的普通javaBean
	 */
	@SuppressWarnings("unchecked")
	public MapPair<K, V> marshal(Page<Map<K, V>> v) throws Exception {
		MapPair<K, V> page = new MapPair<K, V>();
		int size = v.getResult().size();
		int j = 0;
		MapXMLHolder<K, V>[] pageRult = new MapXMLHolder[size];
		for (Map<K, V> map : v.getResult()) {
			MapXMLHolder<K, V> object = new MapXMLHolder<K, V>();
			MapEnty<K, V>[] mapEntys = new MapEnty[map.size()];
			int i = 0;
			for (Map.Entry<K, V> entry : map.entrySet()) {
				MapEnty<K, V> mapEnty = new MapEnty<K, V>();
				mapEnty.setKey(entry.getKey());
				mapEnty.setValue(entry.getValue());
				mapEntys[i] = mapEnty;
				i++;
			}
			object.setEntries(mapEntys);
			pageRult[j] = object;
			j++;
		}
		page.setResult(pageRult);
		page.setPageNo(v.getPageNo());
		page.setPageSize(v.getPageSize());
		page.setTotalCount(v.getTotalCount());
		return page;
	}

	/***
	 * 将mapPair转换为一个Page<Map>类型
	 */
	public Page<Map<K, V>> unmarshal(MapPair<K, V> v) throws Exception {
		Page<Map<K, V>> page = new Page<Map<K, V>>();
		ArrayList<Map<K, V>> lists = new ArrayList<Map<K, V>>();
		Map<K, V> map = null;
		if (v.getResult() == null) {
			page.setResult(lists);
		} else {
			for (MapXMLHolder<K, V> list : v.getResult()) {
				map = new HashMap<K, V>();
				for (MapEnty<K, V> mapEny : list.getEntries()) {
					map.put(mapEny.getKey(), mapEny.getValue());
				}
				lists.add(map);
			}
		}
		page.setResult(lists);
		page.setPageNo(v.getPageNo());
		page.setPageSize(v.getPageSize());
		page.setTotalCount(v.getTotalCount());
		return page;
	}

}
